/*
 * UStringList.cpp
 *
 *  Created on: 2020年3月24日
 *      Author: chuanjiang.zh
 */

#include "UStringList.h"
#include <deque>
#include <algorithm>

#include <sstream>
#include <cstring>


class UStringListPrivate : public std::deque<UString>
{

};


UStringList::UStringList():
		m_pimpl(new UStringListPrivate())
{
}

UStringList::~UStringList()
{
	delete m_pimpl;
}

UStringList::UStringList(const UStringList& strList):
		m_pimpl(new UStringListPrivate())
{
	*m_pimpl = *strList.m_pimpl;
}

UStringList& UStringList::operator = (const UStringList& strList)
{
	*m_pimpl = *strList.m_pimpl;
	return *this;
}

int UStringList::size() const
{
	return (int)m_pimpl->size();
}

bool UStringList::empty() const
{
	return m_pimpl->empty();
}

const UString& UStringList::at(int idx) const
{
	return m_pimpl->at(idx);
}

UString& UStringList::at(int idx)
{
	return m_pimpl->at(idx);
}

UString& UStringList::front()
{
	return m_pimpl->front();
}

const UString& UStringList::front() const
{
	return m_pimpl->front();
}

UString& UStringList::back()
{
	return m_pimpl->back();
}

const UString& UStringList::back() const
{
	return m_pimpl->back();
}

UStringList& UStringList::append(const UString& str)
{
	m_pimpl->push_back(str);
	return *this;
}

UStringList& UStringList::push_back(const UString& str)
{
	m_pimpl->push_back(str);
	return *this;
}

UStringList& UStringList::push_front(const UString& str)
{
	m_pimpl->push_front(str);
	return *this;
}

UStringList& UStringList::insert(int idx, const UString& str)
{
    return *this;
}


void UStringList::removeAt(int idx)
{
	if (idx < 0 || idx >= size())
	{
		return;
	}

	UStringListPrivate::iterator it = m_pimpl->begin();
	std::advance(it, idx);
	m_pimpl->erase(it);
}

void UStringList::removeFirst()
{
	if (empty())
	{
		return;
	}

	m_pimpl->erase(m_pimpl->begin());
}

void UStringList::removeLast()
{
	if (empty())
	{
		return;
	}

	removeAt(size() - 1);
}


bool UStringList::contains(const UString& str) const
{
	for (const UString& element : *m_pimpl)
	{
		if (element == str)
		{
			return true;
		}
	}
	return false;
}

int UStringList::indexOf(const UString& str) const
{
	for (int i = 0; i < (int)m_pimpl->size(); ++ i)
	{
		if (m_pimpl->at(i) == str)
		{
			return i;
		}
	}
	return -1;
}

int UStringList::lastIndexOf(const UString& str) const
{
	for (int i = (int)m_pimpl->size(); i >= 0; -- i)
	{
		if (m_pimpl->at(i) == str)
		{
			return i;
		}
	}
	return -1;
}

void UStringList::sort()
{
	std::sort(m_pimpl->begin(), m_pimpl->end());
}

UString UStringList::join(char separator) const
{
	std::ostringstream ss;
	int count = 0;
	for (const UString& element : *m_pimpl)
	{
		if (count != 0)
		{
			ss << separator;
		}

		ss << element;
		count ++;
	}
	return UString(ss.str());
}

UString UStringList::join(const UString& separator) const
{
	std::ostringstream ss;
	int count = 0;
	for (const UString& element : *m_pimpl)
	{
		if (count != 0)
		{
			ss << separator;
		}

		ss << element;
		count ++;
	}
	return UString(ss.str());
}

void UStringList::clear()
{
	m_pimpl->clear();
}
